# -*- coding: utf-8 -*-
from flask import Flask, render_template, request, jsonify
import json
import os
from openai import OpenAI
from auth import auth_login, require_login

app = Flask(__name__)

client = OpenAI(
    # 若没有配置环境变量，请用百炼API Key将下行替换为：api_key="sk-xxx",
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)


@app.route('/login', methods=['POST', 'GET'])
def login():
    return auth_login()


@app.route('/', methods=['GET'])
@require_login
def index():
    return render_template('index.html')


@app.route('/api/completions', methods=['POST'])
@require_login
def handle_completions():
    """信息提取接口"""
    try:
        data = request.json
        content = data.get('text')
        prompt = data.get('prompt', '')
        resp_content = json.loads(completion_request(content, prompt))
        resp_content = resp_content['choices'][0]['message']['content']
        return jsonify({'code': 200, 'data': resp_content})
    except Exception as e:
        return jsonify({'error': str(e)}), 500


def completion_request(content, extra_info):
    """调用百炼模型服务"""
    prompt = (
        "# 角色\n"
        "你是一名文本分析师，擅长对各种文本内容进行理解。\n\n"
        "# 任务描述\n"
        "给你一个段文本内容，请你完成以下任务。\n"
        "- 分析文本内容，提取关键信息，总结摘要。\n"
        "# 限制\n"
        "- 总结时需严格依据文本内容，不可添加个人臆测或创意性内容。\n"
        "- 总结内容，不可使用markdown格式输出。\n"
        "# 输入数据\n"
        "## 文本补充信息 (可能对你理解该文本有帮助，如果输入为空则忽略补充信息)\n"
        f"{extra_info}\n\n"
        "# 输出格式\n"
        "直接输出内容，不要附带输出任何其他信息和格式。\n"
    )
    completion = client.chat.completions.create(
        model="qwen-turbo",  # 模型列表：https://help.aliyun.com/zh/model-studio/getting-started/models
        messages=[
            {'role': 'user', 'content': content},
            {'role': 'user', 'content': prompt}],
    )

    return completion.model_dump_json()


if __name__ == '__main__':
    app.run(host="0.0.0.0", port=9000)
